/**
 * Looker  新闻整合系统
 * Author  :solosky
 * File    :ModifierManager.java
 * Date    :May 14, 2009
 * Lisence : Apache License 2.0 
 */
package net.looker.monitor.modifier;

import java.util.logging.Logger;

import net.looker.util.BlockQueue;
import net.looker.work.WorkerPool;

/**更改任务分发器
 * 接受更改消息，然后建立更改工作
 * @author solosky
 *
 */
public class Dispatcher
{
	/**
	 * 线程池
	 */
	private WorkerPool 	workerPool;
	
	/**
	 * 更改任务队列
	 */
	private BlockQueue<Modifier> modifierQueue;
	
	/**
	 * 内部线程，执行分配任务
	 */
	private Thread innerThread;
	
	/**
	 * 构造函数
	 * @param workPool
	 * @param queueSize
	 */
	public Dispatcher(WorkerPool workPool, int queueSize)
	{
		this.workerPool = workPool;
		this.modifierQueue = new BlockQueue<Modifier>(queueSize);
		this.innerThread = new Thread(new DispatcherRunner());
		this.innerThread.setName("Dispatcher");
		this.innerThread.start();
	}
	
	/**
	 * 内部类，在内部线程中运行
	 * 如果线程池中有可用的线程，会从当前更改器队列中取出更改器并交给线程完成工作
	 * @author solosky
	 *
	 */
	public class DispatcherRunner implements Runnable
	{
		/* (non-Javadoc)
		 * @see java.lang.Runnable#run()
		 */
		@Override
		public void run()
		{
			try {
				while(true)
				{
					//当队列为空时等待
					modifierQueue.waitWhileEmpty();
					//如果队列不为空，从队列中取出一个更改器，并加个空闲的线程处理
					//如果没有可用的线程，就会在此等待，直到有可用的线程
					workerPool.assignWork(modifierQueue.remove());
				}
			} catch (InterruptedException e) {
				Logger.getLogger("looker").warning("更改器分发器中断："+e.toString());
			}
		}	
	}
	
	
	public void addModifier(Modifier m)
	{
		try {
			modifierQueue.add(m);
		} catch (InterruptedException e) {
			Logger.getLogger("looker").warning("添加更改器中断："+e.toString());
		}
	}
	
	/**
	 * 停止分发，终止内部进程
	 */
	public void stopDispatch()
	{
		innerThread.interrupt();
	}

}
